package dataview;

import java.util.LinkedList;
import java.util.List;
import exceptions.DBException;
import store.BaseStore;
import store.Frammento;
import store.Passo;
import store.Ricetta;
import store.RifIngrediente;
import store.RifRicetta;
import store.Termine;
import store.ValutazioniRicettaAttive;

public class RicettaVis {
	private Ricetta ricetta;
	private boolean tutteValutazioni;
	
	public RicettaVis(Ricetta ricetta) {
		this.ricetta = ricetta;
		this.tutteValutazioni = false;
	}
	
	public RicettaVis conTutteValutazioni() {
		RicettaVis r = new RicettaVis(ricetta);
		r.tutteValutazioni = true;
		return r;
	}
	
	public String getNome() {
		return ricetta.getNome();
	}
	
	public String getPresentazione() {
		if (ricetta.getInfo() != null && ricetta.getInfo().getPresentazione() != null) return ricetta.getInfo().getPresentazione();
		return "";
	}
	
	public String getNote() {
		if (ricetta.getInfo() != null && ricetta.getInfo().getNote() != null) return ricetta.getInfo().getNote();
		return "N.D.";
	}
	
	public String getPorzioni() {
		if (ricetta.getInfo() != null) {
			return ricetta.getInfo().getNumeroPorzioni() + " " + (ricetta.getInfo().getUnitaPorzioni() == UnitaPorzioni.altro && ricetta.getInfo().getCustom() != null && !ricetta.getInfo().getCustom().isEmpty()? ricetta.getInfo().getCustom() : ricetta.getInfo().getUnitaPorzioni());
		}
		return "N.D.";
	}
	
	public List<String> getTags() {
		List<String> tags = new LinkedList<String>();
		for (Termine termine : ricetta.getTag())
			tags.add(termine.getTermine());
		return tags;
	}
	
	public String getDifficolta() {
		if (ricetta.getInfo() != null && ricetta.getInfo().getDifficolta() != null) return ricetta.getInfo().getDifficolta().name();
		return "N.D.";
	}
	
	public String getIngredienti() {
		List<RifIngrediente> ingredienti = new LinkedList<RifIngrediente>();
		for (Passo passo : ricetta.getProcedimento())
			for (Frammento frammento : passo.getFrammenti())
				if (frammento instanceof RifIngrediente) aggiungi(ingredienti, (RifIngrediente)frammento);
		
		String s = "";
		for (RifIngrediente rifIngrediente : ingredienti)
			s += "\n    "+rifIngrediente.toString();
		if (s != "") 
			return s;
		return "N.D.";
	}
	
	public String getSottoricette() {
		List<RifRicetta> ricette = new LinkedList<RifRicetta>();
		for (Passo passo : ricetta.getProcedimento())
			for (Frammento frammento : passo.getFrammenti())
				if (frammento instanceof RifRicetta) aggiungi(ricette, (RifRicetta)frammento);
		
		String s = "";
		for (RifRicetta rifRicetta : ricette) {
			s += "\n " + rifRicetta.toString() + ": " + rifRicetta.getRicetta().vis().getIngredienti();
		}
		if (s != "") 
			return s;
		return "N.D.";
	}
	
	private void aggiungi(List<RifIngrediente> lista, RifIngrediente ingrediente) {
		for (RifIngrediente rifIngrediente : lista)
			if (rifIngrediente.getIngrediente().getNome() == ingrediente.getIngrediente().getNome()) {
				rifIngrediente.setQuantita(rifIngrediente.getQuantita() + ingrediente.getQuantita());
				return;
			}
		lista.add(new RifIngrediente(ingrediente.getQuantita(), ingrediente.getIngrediente()));
	}
	
	private void aggiungi(List<RifRicetta> lista, RifRicetta ricetta) {
		for (RifRicetta rifRicetta : lista)
			if (rifRicetta.getRicetta().getNome() == ricetta.getRicetta().getNome()) {
				rifRicetta.setPorzioni(rifRicetta.getnPorzioni() + ricetta.getnPorzioni());
				return;
			}
		lista.add(new RifRicetta(ricetta.getnPorzioni(), ricetta.getRicetta()));
	}
	
	public List<String> getProcedimento() {
		List<String> procedimento = new LinkedList<String>();
		for (Passo p : ricetta.getProcedimento())
			procedimento.add(p.toString());
		return procedimento;
	}
	
	public List<String> getValutazioni() {
		List<String> s = new LinkedList<String>();
		ValutazioniRicettaAttive v;
		try {
			v = BaseStore.getSettingsValutazioneRicette();
		} catch (DBException e) {
			v = new ValutazioniRicettaAttive();
		}
		if (tutteValutazioni || v.eAttiva(ValutazioneRicetta.vegana)) s.add("Vegana: " + (ricetta.isVegana() ? "si" : "no"));
		if (tutteValutazioni || v.eAttiva(ValutazioneRicetta.vegetariana)) s.add("Vegetariana: " + (ricetta.isVegetariana() ? "si" : "no"));
		if (tutteValutazioni || v.eAttiva(ValutazioneRicetta.calorie))
			s.add("Calorie: " + (ricetta.caloriePrecise() ? "" : (char)126) + ricetta.caloriePerPorzione() + " kcal/" + (ricetta.getInfo().getUnitaPorzioni() == UnitaPorzioni.altro ? (ricetta.getInfo().getCustom() != null ? ricetta.getInfo().getCustom() : "porzione") : ricetta.getInfo().getUnitaPorzioni()));
		return s;
	}
}
